package cn.wolfcode.wolfcodemall.service.impl;

import cn.wolfcode.wolfcodemall.domain.Product;
import cn.wolfcode.wolfcodemall.domain.ProductImage;
import cn.wolfcode.wolfcodemall.domain.ProductOrder;
import cn.wolfcode.wolfcodemall.domain.ProductOrderItem;
import cn.wolfcode.wolfcodemall.mapper.ProductImageMapper;
import cn.wolfcode.wolfcodemall.mapper.ProductMapper;
import cn.wolfcode.wolfcodemall.mapper.ProductOrderItemMapper;
import cn.wolfcode.wolfcodemall.mapper.ProductOrderMapper;
import cn.wolfcode.wolfcodemall.qo.PageQo;
import cn.wolfcode.wolfcodemall.service.OrderService;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Set;

@Service
public class OrderServiceImpl  implements OrderService {
    @Autowired
    private ProductOrderMapper productOrderMapper;
    @Autowired
    private ProductOrderItemMapper productOrderItemMapper;
    @Autowired
    private ProductMapper productMapper;
    @Autowired
    private ProductImageMapper productImageMapper;

    @Transactional
    public void createOrderByOne(ProductOrder productOrder, ProductOrderItem productOrderItem, Integer userId) {
        //完善订单信息中的数据
        //订单号      当前的时间 + 用户id   202210211650404
        String orderCode = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + userId;
        productOrder.setProductorderCode(orderCode);
        productOrder.setProductorderCreateDate(new Date());
        productOrder.setProductorderStatus(0); //未付款
        productOrder.setProductorderUserId(userId);
        //保存订单信息
        productOrderMapper.insert(productOrder);

        //完善订单项的数据
        Product product = productMapper.selectByPrimaryKey(productOrderItem.getProductorderitemProductId());
        productOrderItem.setProductorderitemPrice(product.getProductSalePrice().multiply(new BigDecimal(productOrderItem.getProductorderitemNumber() + "")));
        productOrderItem.setProductorderitemOrderId(productOrder.getProductorderId());
        productOrderItem.setProductorderitemUserId(userId);

        //保存订单项信息
        productOrderItemMapper.insert(productOrderItem);
    }

    public ProductOrder findProductOrderByOrderId(Integer orderId) {
        //查询订单信息
        ProductOrder productOrder = productOrderMapper.selectByPrimaryKey(orderId);
        //查询订单中包含的订单项信息
        List<ProductOrderItem> productOrderItemList = productOrderItemMapper.selectByOrderId(orderId);
        //查询订单项中商品信息
        for (ProductOrderItem productOrderItem : productOrderItemList) {
            Product product = productMapper.selectByPrimaryKey(productOrderItem.getProductorderitemProductId());
            productOrderItem.setProductOrderItemProduct(product);
        }

        //将订单项信息存储到订单对象中
        productOrder.setProductOrderItemList(productOrderItemList);
        return productOrder;
    }

    public void orderPay(Integer orderId) {
        //根据订单id查询到订单信息
        ProductOrder productOrder = productOrderMapper.selectByPrimaryKey(orderId);
        //修改订单的支付时间以及订单状态
        productOrder.setProductorderPayDate(new Date());
        productOrder.setProductorderStatus(1);

        productOrderMapper.updateByPrimaryKey(productOrder);
    }

    public PageInfo<ProductOrder> selectOrderByUserId(PageQo qo, Integer userId, Integer status) {
        PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize());
        //查询订单信息
        List<ProductOrder> productOrderList = productOrderMapper.selectOrderByUserId(userId, status);
        //查询每一个订单中的订单项信息
        for (ProductOrder productOrder : productOrderList) {
            List<ProductOrderItem> orderItemList = productOrderItemMapper.selectByOrderId(productOrder.getProductorderId());
            //查询每一个订单项中商品信息
            for (ProductOrderItem productOrderItem : orderItemList) {
                Product product = productMapper.selectByPrimaryKey(productOrderItem.getProductorderitemProductId());
                //查询商品的概述图片
                List<ProductImage> productSinglePic = productImageMapper.selectProductSinglePic(product.getProductId());

                product.setProductSinglePicList(productSinglePic);
                //将查询到的商品信息存储到订单项对象中
                productOrderItem.setProductOrderItemProduct(product);
            }

            //将订单项存储到订单对象中
            productOrder.setProductOrderItemList(orderItemList);
        }
        return new PageInfo<ProductOrder>(productOrderList);
    }

    public void addCart(Integer productId, Short productNumber, Integer userId) {
        Product product = productMapper.selectByPrimaryKey(productId);
        //检查购物车中是否包含该商品
        ProductOrderItem productOrderItem1 = productOrderItemMapper.selectCartByProductIdAndUserId(productId, userId);
        //如果有,修改购物车项的数量
        if (productOrderItem1 != null) {
            productOrderItem1.setProductorderitemNumber((short) (productOrderItem1.getProductorderitemNumber() + productNumber));
            productOrderItemMapper.updateByPrimaryKey(productOrderItem1);

        } else {
            //如果没有,创建购物车项

            //创建订单项对象
            ProductOrderItem productOrderItem = new ProductOrderItem();
            productOrderItem.setProductorderitemNumber(productNumber);
            productOrderItem.setProductorderitemProductId(productId);
            productOrderItem.setProductorderitemUserId(userId);
            productOrderItem.setProductorderitemPrice(product.getProductSalePrice().multiply(new BigDecimal(productNumber + "")));

            productOrderItemMapper.insert(productOrderItem);
        }

    }


    public List<ProductOrderItem> findCart(Integer userId) {
        List<ProductOrderItem> orderItemList = productOrderItemMapper.selectCartByUserId(userId);
        for (ProductOrderItem productOrderItem : orderItemList) {
            Product product = productMapper.selectByPrimaryKey(productOrderItem.getProductorderitemProductId());
            List<ProductImage> productImages = productImageMapper.selectProductSinglePic(product.getProductId());
            product.setProductSinglePicList(productImages);

            productOrderItem.setProductOrderItemProduct(product);
        }
        return orderItemList;
    }

    public void changeOrderItemNumber(Integer orderItemId, Short productNumber) {
        //查询要修改的购物车项
        ProductOrderItem productOrderItem = productOrderItemMapper.selectByPrimaryKey(orderItemId);
        productOrderItem.setProductorderitemNumber(productNumber);
        Product product = productMapper.selectByPrimaryKey(productOrderItem.getProductorderitemProductId());
        productOrderItem.setProductorderitemPrice(product.getProductSalePrice().multiply(new BigDecimal(productNumber + "")));

        productOrderItemMapper.updateByPrimaryKey(productOrderItem);
    }

    public ProductOrderItem findCartById(Integer orderItemId) {
        ProductOrderItem productOrderItem = productOrderItemMapper.selectByPrimaryKey(orderItemId);
        //查询购物车项中的商品信息
        Product product = productMapper.selectByPrimaryKey(productOrderItem.getProductorderitemProductId());
        //查询商品的概述图片
        List<ProductImage> productImages = productImageMapper.selectProductSinglePic(product.getProductId());
        product.setProductSinglePicList(productImages);
        productOrderItem.setProductOrderItemProduct(product);

        return productOrderItem;
    }


    public void createOrderByList(ProductOrder productOrder, String orderItemJSON, Integer userId) {
        //完善订单信息中的数据
        //订单号      当前的时间 + 用户id   202210211650404
        String orderCode = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + userId;
        productOrder.setProductorderCode(orderCode);
        productOrder.setProductorderCreateDate(new Date());
        productOrder.setProductorderStatus(0); //未付款
        productOrder.setProductorderUserId(userId);
        //保存订单信息
        productOrderMapper.insert(productOrder);

        //完善订单项信息
        //将orderItemJSON解析为对象
        JSONObject jsonObject = JSONObject.parseObject(orderItemJSON);
        //从jsonObject对象中获取所有的订单项id
        Set<String> orderItemIds = jsonObject.keySet();
        //遍历出每一个订单项id，查询到每一个订单项对象，完善信息
        for (String orderItemId : orderItemIds) {
            ProductOrderItem productOrderItem = productOrderItemMapper.selectByPrimaryKey(Integer.valueOf(orderItemId));

            productOrderItem.setProductorderitemOrderId(productOrder.getProductorderId());
            productOrderItem.setProductorderitemUsermessage(jsonObject.getString(orderItemId));

            productOrderItemMapper.updateByPrimaryKey(productOrderItem);
        }

    }

    @Override
    public List<ProductOrder> selectAll(Integer productOrderCode, Integer productOrderPost, List<Integer> productOrderStatus) {
        return productOrderMapper.selectAll(productOrderCode, productOrderPost,productOrderStatus);
    }

    @Override
    public ProductOrder selectById(Integer orderId) {
        return productOrderMapper.selectById(orderId);
    }

    @Override
    public int deleteByPrimaryKey(Integer productorderitemId) {
        return productOrderItemMapper.deleteByPrimaryKey(productorderitemId);
    }

    @Override
    public int logicDeleteByOrderId(Integer productOrderId, Integer orderStatus) {
        return productOrderMapper.logicDeleteByOrderId(productOrderId, orderStatus);
    }


    @Override
    public void deleteById(Integer orderItemId) {
        List<ProductOrderItem> productOrderItems = productOrderItemMapper.selectByOrderId(orderItemId);
        productOrderItemMapper.deleteByPrimaryKey(orderItemId);
    }

}
